/*
 * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
 * The software in this package is published under the terms of the CPAL v1.0
 * license, a copy of which has been included with this distribution in the
 * LICENSE.txt file.
 */
package org.mule.runtime.config.spring.parsers.assembly.configuration;

import java.util.Map;

/**
 * This collects together various constraints/rewrites that can be applied to attributes. It was extracted from
 * AbstractMuleBeanDefinitionParser and should be used as a delegate (see that class for an example).
 *
 * <p>
 * Ignored, reference and collection flags are all keyed off the "old" name (before any alias or mapping), with any "-ref"
 * dropped. No normalisation of mapping or aliases is attempted.
 * </p>
 */
public interface PropertyConfiguration {

  void addReference(String propertyName);

  void addMapping(String propertyName, Map<String, Object> mappings);

  void addMapping(String propertyName, String mappings);

  void addMapping(String propertyName, ValueMap mappings);

  void addAlias(String alias, String propertyName);

  /**
   * This will automatically generate a list and accumulate values. If the value is a map then instead of generating a list of
   * maps we combine map entries together.
   */
  void addCollection(String propertyName);

  void addIgnored(String propertyName);

  void removeIgnored(String propertyName);

  void setIgnoredDefault(boolean ignoreAll);

  String getAttributeMapping(String alias);

  String getAttributeAlias(String name);

  boolean isCollection(String propertyName);

  boolean isIgnored(String propertyName);

  /**
   * A property can be explicitly registered as a bean reference via registerBeanReference() or it can simply use the "-ref"
   * suffix.
   * 
   * @param attributeName true if the name appears to correspond to a reference
   */
  boolean isReference(String attributeName);

  SingleProperty getSingleProperty(String propertyName);

  /**
   * Extract a JavaBean property name from the supplied attribute name.
   * <p>
   * The default implementation uses the {@link org.springframework.core.Conventions#attributeNameToPropertyName(String)} method
   * to perform the extraction.
   * <p>
   * The name returned must obey the standard JavaBean property name conventions. For example for a class with a setter method
   * '<code>setBingoHallFavourite(String)</code>', the name returned had better be '<code>bingoHallFavourite</code>' (with that
   * exact casing).
   *
   * @param oldName the attribute name taken straight from the XML element being parsed; will never be <code>null</code>
   * @return the extracted JavaBean property name; must never be <code>null</code>
   */
  String translateName(String oldName);

  Object translateValue(String name, String value);

}
